/**
 * 错误码处理工具
 * 根据错误码提供友好的错误提示
 */

// 错误码映射表（根据错误码.md整理）
const ERROR_CODES = {
    200: {
        message: '业务处理成功',
        suggestion: '-'
    },
    400: {
        message: '参数错误',
        suggestion: '检查接口参数是否正确'
    },
    401: {
        message: '鉴权失败或 Token 超时',
        suggestion: '确认 API KEY 和鉴权 token 是否正确生成'
    },
    404: {
        message: '资源不存在',
        suggestion: '检查请求的资源ID是否正确'
    },
    429: {
        message: '请求频率过高或账户异常',
        suggestion: '调整请求频率，检查账户状态'
    },
    434: {
        message: '暂无 API 权限，微调 API 及文件管理 API 为内测阶段，我们会尽快开放',
        suggestion: '等待接口正式开放或请联系平台客服申请内测'
    },
    435: {
        message: '文件大小超过 100MB',
        suggestion: '使用小于 100MB 的 jsonl 文件或分批上传'
    },
    500: {
        message: '服务器处理请求时发生错误',
        suggestion: '稍后重试或联系客服'
    }
};

// 429错误的详细类型（根据错误码.md整理）
const ERROR_429_TYPES = {
    'concurrent_limit': {
        message: '接口请求并发超额',
        suggestion: '调整请求频率或联系商务扩大并发数'
    },
    'upload_frequency': {
        message: '上传文件频率过快',
        suggestion: '短暂等待后重新请求'
    },
    'balance_exhausted': {
        message: '账户余额已用完',
        suggestion: '进行账户充值以确保余额充足'
    },
    'account_abnormal': {
        message: '账户异常',
        suggestion: '账户存违规行为，请联系平台客服或service@zhipuai.cn解除相关锁定'
    },
    'terminal_abnormal': {
        message: '终端账号异常',
        suggestion: '终端用户存在违规行为，账号已被锁定'
    }
};

/**
 * 解析错误信息
 * @param {Error|Object} error - 错误对象或响应数据
 * @returns {Object} 格式化的错误信息 {code, message, suggestion}
 */
function parseError(error) {
    // 如果是axios错误
    if (error.response) {
        const status = error.response.status;
        const data = error.response.data || {};
        
        // 检查是否有错误码
        const errorCode = data.error_code || status;
        const errorMessage = data.error || data.message || ERROR_CODES[status]?.message || '未知错误';
        
        // 处理429错误
        if (status === 429) {
            const errorType = data.error_type || 'concurrent_limit';
            const error429Info = ERROR_429_TYPES[errorType] || ERROR_429_TYPES['concurrent_limit'];
            return {
                code: status,
                message: error429Info.message,
                suggestion: error429Info.suggestion,
                original: errorMessage
            };
        }
        
        // 其他错误
        const errorInfo = ERROR_CODES[status] || ERROR_CODES[500];
        return {
            code: status,
            message: errorMessage || errorInfo.message,
            suggestion: errorInfo.suggestion,
            original: data.error || errorMessage
        };
    }
    
    // 如果是普通错误对象
    if (error.message) {
        return {
            code: 500,
            message: error.message,
            suggestion: ERROR_CODES[500].suggestion,
            original: error.message
        };
    }
    
    // 如果是字符串
    if (typeof error === 'string') {
        return {
            code: 500,
            message: error,
            suggestion: ERROR_CODES[500].suggestion,
            original: error
        };
    }
    
    // 默认错误
    return {
        code: 500,
        message: '未知错误',
        suggestion: '请稍后重试或联系客服',
        original: String(error)
    };
}

/**
 * 显示错误提示（使用Element UI的Message）
 * @param {Error|Object} error - 错误对象
 * @param {Object} options - 选项 {showDetail: boolean, duration: number}
 */
function showError(error, options = {}) {
    const { showDetail = false, duration = 5000 } = options;
    const errorInfo = parseError(error);
    
    // 构建错误消息
    let message = errorInfo.message;
    if (showDetail && errorInfo.suggestion) {
        message += `\n${errorInfo.suggestion}`;
    }
    
    // 使用Element UI显示错误
    if (window.Vue && window.Vue.prototype.$message) {
        window.Vue.prototype.$message({
            message: message,
            type: 'error',
            duration: duration,
            showClose: true
        });
    } else {
        // 降级到alert
        alert(`错误 ${errorInfo.code}: ${message}\n建议: ${errorInfo.suggestion}`);
    }
    
    return errorInfo;
}

/**
 * 显示错误提示（使用Element UI的Alert组件）
 * @param {Error|Object} error - 错误对象
 * @returns {Object} 格式化的错误信息
 */
function formatError(error) {
    return parseError(error);
}

// 导出
if (typeof module !== 'undefined' && module.exports) {
    module.exports = { parseError, showError, formatError, ERROR_CODES, ERROR_429_TYPES };
} else {
    window.ErrorHandler = { parseError, showError, formatError, ERROR_CODES, ERROR_429_TYPES };
}

